package com.test.sort;

import java.util.Arrays;

/**
 * @author: 蒿雨
 * @create: 2022-02-14 12:12
 * @description:希尔排序法（交换法）
 */
public class Shell2Sort {
    public static void main(String[] args) {
        //原始10位数组
        int[] arr = {8, 9, 1, 7, 2, 3, 5, 4, 6, 0};
        //希尔排序，交换法
        shellSort(arr);
        //原始10位数组
        int[] arrNew = {8, 9, 1, 7, 2, 3, 5, 4, 6, 0};
        //希尔排序，移位法
       // shellSortMove(arrNew);
    }

    //希尔排序交换法
    private static void shellSort(int[] arr) {
        //循环优化
        //思路：对数组进行两两分组，分别进行排序，而后再进行二次分组
        //原始10位数组
        //int[] arr = {8, 9, 1, 7, 2, 3, 5, 4, 6, 0};
        //gap：步长
        int temp = 0;
        //首先把总个数/2，形成最大步长，然会迭代/2
        for (int gap = arr.length / 2; gap > 0; gap /= 2) {
            //进行循环插入排序
            //gap=5;i<10;进行5次循环，每组进行一次交换
            for (int i = gap; i < arr.length; i++) {

                for (int j = i - gap; j >= 0; j -= gap) {

                    if (arr[j] > arr[gap + j]) {
                       //交换方法
                        swap(arr, j, gap + j);
                    }
                }
            }
        }
        System.out.println("希尔排序交换法：" + Arrays.toString(arr));
    }

    //希尔排序移位法
    private static void shellSortMove(int[] arrNew) {


    }

    //交换方法（通过求和的方法完成两位数字的交换）
    public static void swap(int[] arr, int a, int b) {
        arr[a] = arr[a] + arr[b];
        arr[b] = arr[a] - arr[b];
        arr[a] = arr[a] - arr[b];
    }
}
